/******************************************************************* ParseWindow.c Does open a simple window with some easy gadgets and does parse the supplied arguments. *********************************************************************/ #define PARENT #include "/includes/Window.h" // a template is already defined in our project.h (repeat ->) // "AutoClose/N,SmallBorder/K,Quit/S" // I want to do an additional work - we does parse the argument // supplied to "SmallBorder" again. So we need an additional template #define ON_OFF_TEMPLATE "0/S,OFF/S,FALSE/S,NO/S,1/S,ON/S,TRUE/S,YES/S" // maximum count of items in our second template #define MAX_ON_OFF_COUNT 8 // if the result is higher or equal this, it means "on" - else "off" #define ON_CASE 4 // we allow to use the first 4 to turn the small border off - but here // we don't do that, we show only the result of parsing to keep the // source easy. /********************************************************************/ // locale prototypes BOOL OpenDOpusWin( WindowHandle *wh ); BOOL HandleWindow( WindowHandle *wh ); void ParseArguments( WindowHandle *wh, STRPTR args ); /********************************************************************/ void OwnWindow( STRPTR args, struct Screen *screen ) { WindowHandle *wh; if( (wh = AllocMemH(mempool, sizeof(WindowHandle))) ) // allocate some memory { wh->screen = screen; // store the screen pointer if( OpenDOpusWin(wh) ) // open the window { // this we need to indicate that the second argument was empty wh->result = 9; // since we can not show the results we does not need to parse // the aguments earlier... ParseArguments( wh, args ); // we copy now the arguments into the text gadget // if we have supplied some... SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) args ); while( TRUE ) { wh->signals = Wait( 1 << wh->win->UserPort->mp_SigBit ); // wait for window events if( wh->signals & 1 << wh->win->UserPort->mp_SigBit ) if( HandleWindow(wh) ) break; // does end the while loop } if( wh->fargs ) // free the FuncArgs DisposeArgs( wh->fargs ); CloseConfigWindow( wh->win ); } FreeMemH( wh ); // free our memory } } /********************************************************************/ // This function does open our window. We could have done this in the // function OwnWindow() too, but we need this function later again. BOOL OpenDOpusWin( WindowHandle *wh ) { NewConfigWindow ncfgwin; // we need a NewConfigWindow structure too // of couse you could also allocate it with // AllocMemH()... // and have to fill it ncfgwin.nw_Parent = wh->screen; // open on this screen // getting a localized title... ncfgwin.nw_Title = DOpusGetString( locale, MSG_WINDOW_TITLE ); ncfgwin.nw_Dims = &cfgwin; // a pointer to the ConfigWin structure ncfgwin.nw_Locale = locale; // the module locale pointer (from modinit.c) ncfgwin.nw_Port = NULL; // we doesn't supply a port ncfgwin.nw_Font = NULL; // just taking the screen font ncfgwin.nw_Flags = WINDOW_REQ_FILL | // fill with stripple pattern WINDOW_AUTO_KEYS | // handle keys automatic WINDOW_SCREEN_PARENT; // nw_Parent points to a screen if( (wh->win = OpenConfigWindow(&ncfgwin)) ) // open the window { if( (wh->olist = AddObjectList(wh->win, odef)) ) // add the gadgets return TRUE; CloseConfigWindow( wh->win ); // in error case do not forget :-) } return FALSE; } /********************************************************************/ // we does only close the window, if the closegadget was pressed // if you want to close it within a gadget, you must only in the // right case set "stop" to TRUE BOOL HandleWindow( WindowHandle *wh ) { BOOL stop = FALSE; ULONG value; while( !stop && (wh->imsg = GetWindowMsg(wh->win->UserPort)) ) { switch( wh->imsg->Class ) // let's handle the IDCMP { case IDCMP_GADGETUP: switch( GET_ID(wh->imsg) ) { case GADGET_ID_CYCLE: // here we do show the results of our parsing or even a simple text if( wh->fargs ) { value = GetGadgetValue( wh->olist, GADGET_ID_CYCLE ); // value is now in range between 0 and 2 - just what we need... :) switch( value ) { case 0: sprintf( wh->buffer, "AutoClose value: %ld", wh->fargs->FA_Arguments[0] ? *(ULONG *) wh->fargs->FA_Arguments[0] : 0 ); break; case 1: if( wh->result == 9 ) strcpy( wh->buffer, "No valid value for SmallBorder" ); else { if( wh->result < ON_CASE ) strcpy( wh->buffer, "SmallBorder goes off" ); else strcpy( wh->buffer, "SmallBorder goes on" ); } break; case 2: sprintf( wh->buffer, "Switch QUIT was %ssupplied", wh->fargs->FA_Arguments[2] ? NULL : "not " ); break; } } else strcpy( wh->buffer, "No arguments supplied" ); SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) wh->buffer ); break; case GADGET_ID_OKAY: // doing a message SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) DOpusGetString(locale, MSG_OKAY_DONE) ); break; case GADGET_ID_CANCEL: SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) DOpusGetString(locale, MSG_CANCEL_DONE) ); break; } break; case IDCMP_CLOSEWINDOW: // we can not simply return here, the IntuiMessage must replied first stop = TRUE; break; } ReplyWindowMsg( wh->imsg ); // remember: You should not use any other routines // to get/reply the messages of this window than // GetWindowMsg() and ReplyWindowMsg() !! } return stop; } void ParseArguments( WindowHandle *wh, STRPTR args ) { if( (wh->fargs = ParseArgs(FUNC1_TEMPLATE, args)) ) { // now is already the main done // if you want to access the result of parsing -> // for the first of the template (it's an ULONG value) // result = *(ULONG *) wh->fargs->FA_Arguments[0]; // for the second of the template (it's a STRPTR) // result = wh->fargs->FA_Arguments[1]; // for the last of the template (it's a BOOL) // result = wh->fargs->FA_Arguments[2]; // BUT REMEMBER : // wh->fargs->FA_Arguments[x] itself is NULL, if the // matching keyword was not supplied // If you does not test this, an Enforcer hit is the // "lowest" result you'll get... // All clear ? // Let's do it again -> we check now, if something // and what of our ON_OFF_TEMPLATE was supplied to // the SmallBorder argument FuncArgs *fargs; // we need a second pointer if( !wh->fargs->FA_Arguments[1] ) return; if( (fargs = ParseArgs(ON_OFF_TEMPLATE, (STRPTR) wh->fargs->FA_Arguments[1])) ) { // now we scan through the results and store them // as ULONG for( wh->result = 0; wh->result < MAX_ON_OFF_COUNT; wh->result++ ) if( fargs->FA_Arguments[wh->result] ) break; // we have now in wh->result: // - a value in range of 0 to 3 for any kind of "off" // - a value in range of 4 to 7 for any kind of "on" // - a value of 8, if nothing of the ON_OFF_TEMPLATE was supplied, but anything else... // - or even 9, if "SmallBorder" was not supplied or invalid DisposeArgs( fargs ); } // you may also take a look to HandleWindow() // I do there our output within the cycle and text gadget } }